package com.feng.exer;

//创建单链表（以及链表的常用方法）
public class CreateLinklistImpl implements CreateLinklist{
    //定义不改变的头结点
    public final DefineNode HeadNode = new DefineNode();

    //添加结点到链表中
    @Override
    public void add(DefineNode node) {
        //设置一个辅助遍历
        DefineNode temp = HeadNode;
        //先遍历找到最后一个结点（判断下一个是否为空）
        while(true){
            if (temp.next==null){
                break;
            }
            temp=temp.next;
        }
        //根据上面找到的最后一个结点，在其后面添加新结点
        temp.next=node;
    }

    @Override
    public void addById(DefineNode node) {
        DefineNode temp = HeadNode;
        //找到下一个结点刚刚大于当前要添加的结点的id
        while (true){
            if (temp.next==null){
                break;
            }
            if (temp.next.id==node.id){
                System.out.println("存在相同的id，添加失败");
                //return直接结束整个方法，break只是结束循环
                return;
            }
            if (temp.next.id>node.id){
                break;
            }
            temp=temp.next;
        }
        //把找到的位置进行插入结点
        node.next=temp.next;
        temp.next=node;
    }

    @Override
    public void del(int id) {
        //根据id删除结点
        DefineNode temp = HeadNode;
        if (temp.next==null){
            System.out.println("链表为空");
            return;
        }
        while (true){
            if (temp.next==null){
                System.out.println("需要删除的结点不存在");
                return;
            }
            if (temp.next.id==id){
                if (temp.next.next!=null){
                    temp.next=temp.next.next;
                }else {
                    temp.next=null;
                }
//                break;
                return;
            }
            temp = temp.next;
        }

    }

    @Override
    public void update1(DefineNode node) {
        //方式一：根据id修改结点中的值（不替换整个结点）
        //根据id值相同更新对应的结点
        DefineNode temp = HeadNode.next;
        if (temp==null){
            System.out.println("链表为空");
            return;
        }
        while (true){
            if (temp==null){
                System.out.println("需要更新的结点不存在");
                return;
            }
            if (temp.id==node.id){
                temp.name=node.name;
                temp.password=node.password;
                return;
            }
            temp = temp.next;
        }

    }

    @Override
    public void update2(DefineNode node) {
        //方式二：根据id替换整个结点
        //根据id值相同更新对应的结点
        DefineNode temp = HeadNode;
        if (temp.next==null){
            System.out.println("链表为空");
            return;
        }
        while (true){
            if (temp.next==null){
                System.out.println("需要更新的结点不存在");
                return;
            }
            if (temp.next.id==node.id){
                if (temp.next.next!=null){
                    node.next=temp.next.next;
                    temp.next=node;
                }else {
                    temp.next=node;
                }
                return;
            }
            temp = temp.next;
        }
    }

    @Override
    public void display() {
        if (HeadNode.next==null){
            System.out.println("链表为空");
            return;
        }
        DefineNode temp = HeadNode.next;
        while (temp!=null){
            System.out.println(temp);
            temp=temp.next;
        }
    }

    //头插法，更简单
    @Override
    public void HeadAdd(DefineNode node) {
        /*DefineNode temp = HeadNode;
        node.next=temp.next;
        temp.next=node;*/
        node.next=HeadNode.next;
        HeadNode.next=node;
    }
}
